package com.itheima.d3_stream;

import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * 目标：掌握Stream流提供的常见中间方法。
 */
public class StreamTest3 {
    public static void main(String[] args) {
        // 需求1：已知如下数据，找出成绩大于等于60分的数据，并升序后，再输出。
        List<Double> scores = new ArrayList<>();
        Collections.addAll(scores, 88.5, 100.0, 60.0, 99.0, 9.5, 99.6, 25.0);

        scores.stream()
                .filter(score->score>=60)
//                .sorted() //默认按照元素的排序规则升序排序
                .sorted((s1,s2)->Double.compare(s2,s1)) //降序
                .forEach(System.out::println);

        System.out.println("==============");



        List<Student> students = new ArrayList<>();
        Student s1 = new Student("蜘蛛精", 26, 172.5);
        Student s2 = new Student("蜘蛛精", 26, 172.5);
        Student s3 = new Student("紫霞", 23, 167.6);
        Student s4 = new Student("白晶晶", 25, 169.0);
        Student s5 = new Student("牛魔王", 35, 183.3);
        Student s6 = new Student("牛夫人", 34, 168.5);
        Collections.addAll(students, s1, s2, s3, s4, s5, s6);
        // 需求2：已知students学生集合，找出年龄大于等于23,且年龄小于等于30岁的学生，并按照年龄降序输出.
        students.stream()
//                .filter(age->age>=23 && age<=30) //错误的，流中的数据不是年龄而是学生对象
                .filter(stu -> stu.getAge() >= 23 && stu.getAge() <= 30)
                .sorted((stu1, stu2) -> Integer.compare(stu2.getAge(), stu2.getAge()))
                .forEach(System.out::println);

        System.out.println("=========");

        // 需求3：已知students学生集合，取出身高最高的前3名学生，并输出。
        students.stream()
                .sorted((stu1, stu2) -> Double.compare(stu2.getHeight(), stu2.getHeight()))
                .limit(3)
                .forEach(System.out::println);

        System.out.println("=========");

        // 需求4：取出身高倒数2名学生，并输出学生信息。
        students.stream()
                .sorted((stu1, stu2) -> Double.compare(stu2.getHeight(), stu2.getHeight()))
                .skip(students.size()-2)
                .forEach(System.out::println);

        // 需求5：找出身高超过168的学生叫什么名字，要求去除重复的名字，再输出。
        // distinct去重复，自定义类型的对象（希望内容一样就认为重复，重写hashCode,equals）
        students.stream()
                .filter(stu -> stu.getHeight() >= 168)
                .distinct() //去重的是学生对象
                .forEach(System.out::println);

        System.out.println("===========");

        //需求6：把学生集合中所有的名字拿出来，并把重复的名字去重
//        students.stream()
//                .map(new Function<Student, String>() {
//                    @Override
//                    public String apply(Student student) {
//                        return student.getName();
//                    }
//                });
        students.stream()
                .map(student -> student.getName()) //把流中的学生对象转换为名字字符串数据
                .distinct() //去重的是字符串
                .forEach(System.out::println);

        System.out.println("=========");

        //需求7：已知第一组的名字和第二组的名字集合，把两个组生成的流合并为一个流
        Stream<String> stream1 = Stream.of("张三丰", "张无忌", "张翠山");
        Stream<String> stream2 = Stream.of("灭绝师太", "周芷若", "赵敏");
        Stream.concat(stream1,stream2)
                .forEach(System.out::println);

    }
}
